﻿#define  _CRT_SECURE_NO_WARNINGS 1
                                       //数组
//要存放数据的话，我们现在只能创建变量，
//int a = 0; 如果我们要创建100个数值，我们就创建100？，显然很麻烦
//为了能够存放多个相同类型的数值，就有了数组
//数组是⼀组相同类型元素的集合；从这个概念中我们就可以发现2个有价值的信息：
//数组中存放的是1个或者多个数据，但是数组元素个数不能为0。
//数组中存放的多个数据，类型是相同的。
//数组分为⼀维数组和多维数组，多维数组⼀般⽐较多⻅的是⼆维数组。
//一维数组的基本语法：type arr_name[常量值];       //type类型  arr_name名字  []中的常量值用来指明数组的大小
//放在数组里的值称为数组的元素，数组在创建的时候可以指定数组的大小和数组的元素类型
//⽐如：我们现在想存储某个班级的20⼈的数学成绩，那我们就可以创建⼀个数组，如下:
//在数组创建的时候给它一个值，这就是数组的初始化
//int main()
//{
//    //一维数组的创建
//    int math[20];//数组有20个元素，每个元素的类型是int
//    char ch[5];
//    double arr[6];
//    //数组的初始化
//    int math[20] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; //数组的完全初始化
//    int math2[20] = { 0,1,2,3,4,5 };//不完全初始化，剩下的元素默认初始化为0
//
//    char ch[5] = { 'a','b' };
//    char ch2[5] = "abc";
//
//    double arr[6] = {0.0};
//    return 0;
//}

//int main()
//{
//    int a = 10;
//    char ch = 'w';
//    double d = 0.0;
//
//    int arr[10] = { 0 };
//    //数组有没有类型
//    // 数组的类型是什么 
//    //数组的元素类型是int
//    //数组的类型 - int[10] 把名字去掉就行
//    int arr2[5]; //数组的类型-int[5]
//    return 0;
//}

//int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//下标：          0 1 2 3 4 5 6 7 8 9     下标从0开始
#include <stdio.h>
//int main()
//
//{
//    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };  //[10]是指定数组的元素个数的
//    printf("%d\n", arr[5]); //打印结果就是6  []--下标引用操作符
//    printf("%d\n", arr[9]);//10
//    return 0;
//}
//int main()
//
//{
//    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };  //当对数组初始化的时候，数组的大小可以省略
//    //编译器根据数组的初始化内容自动计算数组的元素个数
//    printf("%d\n", arr[5]); //打印结果就是6  []--下标引用操作符
//    printf("%d\n", arr[9]);//10
//    return 0;
//}

//int main()
//{
//    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//    //下标0-9
//    int i = 0;
//    for (i = 0; i < 10; i++)
//    {
//        printf("%d ", arr[i]);//这样就能打印数组里的全部元素
//    }return 0;
//}

//int main()
//{
//    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//    int i = 0;
//    while (i < 10)
//    {
//        printf("%d ", arr[i]);
//        i++;
//    }return 0;
//}

//给数组中输入十个值 打印数组的内容
//int main()
//{
//    int i = 0;
//    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//    for (i = 0; i < 10; i++)
//    {
//        scanf("%d", &arr[i]); //输入10个值给下标1-9
//    }
//    for (i = 0; i < 10; i++)
//    {
//        printf("%d",arr[i]);
//    }
//
//    return 0;
//}

//一维数组在内存中的存储
//int main()
//{
//    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//    //打印十个元素的地址
//    int i = 0;
//    for (i = 0; i < 10; i++)
//    {
//        //printf("%d\n", arr[i]); //加上取地址这个符号就可以了&,取出变量在内存中的地址 
//        printf("&arr[%d] = %p\n",i, &arr[i]);
//    }//地址用%p打印  x64表示64位环境 在64位环境中地址是64bit位的就比较长
//    //为了观察方便我们可以换成x86 32位的环境
//    return 0;
//}
//打印出来他们之间的地址都差4，为什么差4呢？
// 一个int整型的值占四个字节
// 数组在内存中是连续存放的 随着数组下标的增长，地址也是由小（低地址）到大（高地址）变化的
//10进制：0123456789
//16进制：0 1 2 3 4 5 6 7 8 9 a b c d e f（10.11.12.13.14.15）
//6C+4=70  C是12 12+4=16  16进制进1 所以就是70
//sizeof用来计算数组的元素个数
//int main()
//{
//    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//    printf("%zd\n", sizeof(arr)); //数组的大小 单位字节  40 10个整型
//    //计算数组的大小，单独放一个数组名的时候
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    printf("%d\n", sz); //打印出来就是10，这就算出了数组的元素个数
//    //int a = 0;
//    //printf("%zd\n", sizeof(a));  //4  单位：字节
//    //printf("%zd\n", sizeof(int)); //4
//    return 0;
//}
//我们上面的i<10如果我们变化数组的元素个数的时候，每次都要把整个工程的这个都改了
//    很麻烦所以我们就可以直接把数组的元素个数算出来用一个变量表示
//    后续我们的i<这个变量即可
//int main()
//{
//    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//当我把这多加几个元素，下面的代码也不用改，他会自己计算
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    int i = 0;
//    for (i = 0; i < sz; i++)
//    {
//        printf("%d", arr[i]);
//
//    }return 0;
//}

//int main()
//{
//    int arr[10] = { 0 };//10个元素 只是因为我不完全初始化而已
//    int arr2[] = { 0 };//这种数组只有一个元素，而不是10
//    int arr3[] = { 1,2,3,4,5,6,7,8,9,10 };//这才是10个元素6
//    return 0;
//}
//前⾯学习的数组被称为⼀维数组，数组的元素都是内置类型的，如果我们把⼀维数组做为数组的元
//素，这时候就是⼆维数组，⼆维数组作为数组元素的数组被称为三维数组，⼆维数组以上的数组统称
//为多维数组。

//我们如何定义二维数组呢？
// 